package cbbx_sm.decision_maker;

import java.util.Hashtable;
import java.util.List;

import cbbx_sm.decision_maker.search.DynamicProgrammingLookahead;
import cbbx_sm.decision_maker.search.WorldStateTransition;
import cbbx_sm.probabilistic_model.Cluster;
import cbbx_sm.utils.ExperimentManager;

public class DecisionMakerFactory {
	public static IDecisionMaker getRoundRobinDecisionMaker(List<Cluster> clusters, boolean goUP){
		return new RoundRobinDecisionMaker(clusters, goUP);
	}
	
	public static IDecisionMaker getMostLikelyClusterDecisionMaker(){
		return new MostLikelyClusterDecisionMaker();
	}
	
	public static IDecisionMaker getLookAheadDecisionMaker(List<String> cameraIds, 
			Hashtable<String,DynamicProgrammingLookahead> table,
			Hashtable<String, Cluster> clusterIndex,
			double utilityZoom,
			double utilityUP, double delta, int numberOfStates, int numberOfTimeStampsLookAhead){
		return new LookAheadDecisionMaker(cameraIds, table, clusterIndex, utilityZoom, utilityUP, delta, numberOfStates, numberOfTimeStampsLookAhead);
	}
	
	public static IDecisionMaker getTreeLookAheadDecisionMaker(List<String> cameraIds,
			Hashtable<String,WorldStateTransition> table, 
			Hashtable<String, Cluster> clusterIndex,
			double utilityZoom, double utilityUP, int numberOfTimeStampsLookAhead, boolean recordNeededStates){
		return new TreeLookAheadDecisionMaker(cameraIds, table, clusterIndex, utilityZoom, utilityUP, ExperimentManager.numberOfTimeStampsLookAheadTree, recordNeededStates);
	}
	
	public static IDecisionMaker getMostLikelyClusterDecisionMaker(double threshold){
		return new MostLikelyClusterDecisionMaker(threshold);
	}
	
	public static IDecisionMaker getSampleFromDistributionDecisionMaker(double cut_off){
		return new SampleFromDistributionDecisionMaker(cut_off);
	}
	
	public static IDecisionMaker getAlfaBetaDecisionMaker(double alfa, double beta, double cut_off){
		return new AlfaBetaDecisionMaker(alfa, beta, cut_off);
	}

	public static IDecisionMaker getSmartMostLikelyClusterDecisionMaker(
			double utilityZoom, double utilityUP) {
		return new SmartMostLikelyClusterDecisionMaker(utilityZoom, utilityUP);
	}
}
